package ar.edu.utn.frba.tacs.warnes.entities;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Transient;

import org.apache.log4j.Logger;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import ar.edu.utn.frba.tacs.warnes.dao.BaseDaoImpl;
import ar.edu.utn.frba.tacs.warnes.dao.VentaDao;
import ar.edu.utn.frba.tacs.warnes.excepciones.YaEstaVendidaException;

@Entity
public class Venta extends BaseEntityImpl {

	@Transient
	Logger log = Logger.getLogger(Venta.class);

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "PiezaSeq")
	@SequenceGenerator(name = "PiezaSeq", sequenceName = "PiezaSeq")
	private Long id;

	@OneToMany(mappedBy = "venta", fetch = FetchType.LAZY)
	@Cascade(value = { CascadeType.PERSIST })
	private List<Pieza> piezasVendidas = new ArrayList<Pieza>();

	public Venta(){
		this.log.debug("Se ha CREADO una nueva VENTA de piezas con "
				+ this.getPiezasVendidas().size() + " items");	
	}
	
	/**
	 * Agrega una pieza a la reserva. La pieza pasa a tener su estado en
	 * 'Reservado'
	 * 
	 * @param pieza
	 * @throws YaEstaVendidaException
	 */
	public void venderPieza(Pieza pieza) {
		if (this.getPiezasVendidas() == null) {
			this.setPiezasVendidas(new ArrayList<Pieza>());
		}

		pieza.puedoVenderte();
		this.getPiezasVendidas().add(pieza);
		pieza.vendete(this);
		this.log.debug("La PIEZA " + pieza.getDescripcion()
				+ " fue vendida con exito");	
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setPiezasVendidas(List<Pieza> piezasVendidas) {
		this.piezasVendidas = piezasVendidas;
	}

	public List<Pieza> getPiezasVendidas() {
		return this.piezasVendidas;
	}

	/**
	 * Responde si la pieza es parte de esta venta
	 * 
	 * @param pieza
	 * @return <b>true</b> si la pieza esta en la venta <br>
	 *         <b>false</b> si la pieza no esta en la venta
	 */
	public Boolean tienePieza(Pieza pieza) {
		if (this.getPiezasVendidas() != null) {
			return this.getPiezasVendidas().contains(pieza);
		} else {
			return false;
		}
	}

	@Override
	public void delete() {
		BaseDaoImpl<Venta> dao = VentaDao.getInstance();
		dao.delete(this);
	}

	@Override
	public void save() {
		BaseDaoImpl<Venta> dao = VentaDao.getInstance();
		dao.save(this);
	}
}
